package us.kg.kotoriforest.senior.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * ClassName: us.kg.kotoriforest.senior.util.JDBCUtil </br>
 * Description: 实现 JDBC 连接池工具类 </br>
 * 该工具类的目的为 ① 维护一个连接池对象供整个项目使用
 * ② 对外暴露提供和回收连接的方法
 *
 * @author Kotori rotroutine@163.com
 * @version 1.0
 * @since 2024/11/28
 */
public abstract class JDBCUtil {
    /**
     * 这里为什么类型为 DataSource 接口 而不是如 DruidDataSource 等具体的实现类呢？
     * 这是因为 虽然我们目前使用的是 Druid 连接池 但是万一我们之后想要更换连接池呢
     * 把工具类内维护的连接池类型定义为 DataSource 这个连接池必须实现的接口
     * 有利于我们后期更换连接池 在更换连接池时我们只需要重新赋值成对应的连接池对象就好了
     * 不需要更改类型和接口 使用多态的原理提高了工具类的拓展性
     */
    private static final DataSource DATA_SOURCE;

    static {
        Properties properties = new Properties();
        try (InputStream resourceAsStream = JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties")) {
            properties.load(resourceAsStream);

            DATA_SOURCE = DruidDataSourceFactory.createDataSource(properties);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return DATA_SOURCE.getConnection();
    }

    public static void close(Connection connection) throws SQLException {
        if (connection != null) {
            connection.close();
        }
    }
}
